package com.module.imagelib.picture;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.module.imagelib.R;

import java.util.ArrayList;
import java.util.List;

import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
import io.reactivex.Observable;
import io.reactivex.subjects.BehaviorSubject;

public class PictureFragment extends Fragment implements IRxPicture {

    private static String TAG = "PictureFragment";
    private BehaviorSubject<PictureResult> mObservable;
    private final int REQUEST_COMPRESS = 1001;
    private final int REQUEST_CROP = 1002;

    /**
     * startActivityForResult需要有父Activity
     *
     * @param activity
     * @return
     */
    public static PictureFragment newInstance(FragmentActivity activity) {
        FragmentManager fragmentManager = activity.getSupportFragmentManager();

        PictureFragment activityResultFragment = (PictureFragment) fragmentManager.findFragmentByTag(TAG);
        boolean isNewInstance = activityResultFragment == null;
        if (isNewInstance) {
            activityResultFragment = new PictureFragment();
            fragmentManager
                    .beginTransaction()
                    .add(activityResultFragment, TAG)
                    .commitAllowingStateLoss();
            fragmentManager.executePendingTransactions();
        }

        return activityResultFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    public IRxPicture createObservable(){
        mObservable = BehaviorSubject.create();
        return this;
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        List<LocalMedia> selectList = PictureSelector.obtainMultipleResult(data);
        if(resultCode == Activity.RESULT_OK){
            switch (requestCode) {
                case REQUEST_COMPRESS:
                    mObservable.onNext(new PictureResult(resultCode, getCompressPath(selectList)));
                    //onComplete 和 onError 是被观察者发送的事件，两个事件之后，观察者不再继续接收消息。
                    //dispose是观察者主动调用的方法，调用之后，观察者不再继续接收消息。
                    mObservable.onComplete();
                    break;
                case REQUEST_CROP:
                    mObservable.onNext(new PictureResult(resultCode, getCutPath(selectList)));
                    //onComplete 和 onError 是被观察者发送的事件，两个事件之后，观察者不再继续接收消息。
                    //dispose是观察者主动调用的方法，调用之后，观察者不再继续接收消息。
                    mObservable.onComplete();
                    break;
            }
        }
    }

    @Override
    public Observable<PictureResult> startPhoto() {
        return startPhoto(false);
    }

    @Override
    public Observable<PictureResult> startPhoto(boolean isCrop) {
        PictureSelector.create(this)
                .openCamera(PictureMimeType.ofImage())// 单独拍照，也可录像或也可音频 看你传入的类型是图片or视频
                .enableCrop(isCrop)// 是否裁剪
                .compress(true)// 是否压缩
                .withAspectRatio(1, 1)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                .freeStyleCropEnabled(false)// 裁剪框是否可拖拽
                .circleDimmedLayer(false)// 是否圆形裁剪
                .showCropFrame(true)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
                .showCropGrid(true)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
                .openClickSound(true)// 是否开启点击声音
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                //.rotateEnabled() // 裁剪是否可旋转图片
                //.scaleEnabled()// 裁剪是否可放大缩小图片
                //.videoQuality()// 视频录制质量 0 or 1
                //.videoSecond()////显示多少秒以内的视频or音频也可适用
                .forResult(isCrop ? REQUEST_CROP : REQUEST_COMPRESS);//PictureConfig.CHOOSE_REQUEST结果回调onActivityResult code
        return mObservable;
    }

    @Override
    public Observable<PictureResult> startAlbum() {
        return startAlbum(false);
    }

    @Override
    public Observable<PictureResult> startAlbum(boolean isCrop) {
        PictureSelector.create(this)
                .openGallery(PictureMimeType.ofImage())// 全部.PictureMimeType.ofAll()、图片.ofImage()、视频.ofVideo()、音频.ofAudio()
                .loadImageEngine(GlideEngine.createGlideEngine())
                .theme(R.style.picture_white_style)// 主题样式设置 具体参考 values/styles   用法：R.style.picture.white.style
                .imageSpanCount(4)// 每行显示个数
                .selectionMode(PictureConfig.SINGLE)// 多选 or 单选
                .previewImage(true)// 是否可预览图片
                .isCamera(false)// 是否显示拍照按钮
                .isZoomAnim(true)// 图片列表点击 缩放效果 默认true
                //.imageFormat(PictureMimeType.PNG)// 拍照保存图片格式后缀,默认jpeg
                //.setOutputCameraPath("/CustomPath")// 自定义拍照保存路径
                .enableCrop(isCrop)// 是否裁剪
                .compress(true)// 是否压缩
                .synOrAsy(true)//同步true或异步false 压缩 默认同步
                //.compressSavePath(getPath())//压缩图片保存地址
                //.sizeMultiplier(0.5f)// glide 加载图片大小 0~1之间 如设置 .glideOverride()无效
                .withAspectRatio(1, 1)// 裁剪比例 如16:9 3:2 3:4 1:1 可自定义
                .hideBottomControls(false)// 是否显示uCrop工具栏，默认不显示
                .freeStyleCropEnabled(false)// 裁剪框是否可拖拽
                .showCropFrame(true)// 是否显示裁剪矩形边框 圆形裁剪时建议设为false
                .showCropGrid(true)// 是否显示裁剪矩形网格 圆形裁剪时建议设为false
                .openClickSound(true)// 是否开启点击声音
//                .selectionMedia(selectList)// 是否传入已选图片
                //.isDragFrame(false)// 是否可拖动裁剪框(固定)
//                        .videoMaxSecond(15)
//                        .videoMinSecond(10)
                //.previewEggs(false)// 预览图片时 是否增强左右滑动图片体验(图片滑动一半即可看到上一张是否选中)
                .minimumCompressSize(100)// 小于100kb的图片不压缩
                //.cropWH()// 裁剪宽高比，设置如果大于图片本身宽高则无效
                //.rotateEnabled(true) // 裁剪是否可旋转图片
                //.scaleEnabled(true)// 裁剪是否可放大缩小图片
                .forResult(isCrop ? REQUEST_CROP : REQUEST_COMPRESS);//结果回调onActivityResult code
        return mObservable;
    }

    /**
     * 获取裁剪图片路径
     *
     * @param selectList
     * @return
     */
    private List<String> getCutPath(List<LocalMedia> selectList) {
        List<String> urls = new ArrayList<>();
        for (LocalMedia localMedia : selectList) {
            urls.add(localMedia.getCutPath());
        }
        return urls;
    }

    /**
     * 获取压缩图片路径
     *
     * @param selectList
     * @return
     */
    private List<String> getCompressPath(List<LocalMedia> selectList) {
        List<String> urls = new ArrayList<>();
        for (LocalMedia localMedia : selectList) {
            urls.add(localMedia.getCompressPath());
        }
        return urls;
    }
}
